home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2001 / MacHack 2001.toast / pc / The Hacks / TECalc ƒ / TEPeste.c < prev   
Encoding:
C/C++ Source or Header  |  2001-06-23  |  2.6 KB  |  163 lines

  1. /*
  2.     
  3.     TEPeste
  4.     
  5.     Joshua Juran
  6.     
  7. */
  8.  
  9. #include <string.h>
  10.  
  11. #include <Events.h>
  12. #include <Resources.h>
  13. #include <Sound.h>
  14. #include <TextEdit.h>
  15.  
  16. // Needed for globals
  17. #include <A4Stuff.h>
  18.  
  19. #define _TEPaste 0xA9DB
  20.  
  21. //static pascal short PatchedGetNextEvent(EventMask, EventRecord *theEvent);
  22. static pascal void PatchedTEPaste(TEHandle hTE);
  23.  
  24. //typedef pascal short (*GetNextEventProcPtr)(EventMask, EventRecord *);
  25. //static GetNextEventProcPtr    origGetNextEvent;
  26. typedef pascal void (*TEPasteProcPtr)(TEHandle);
  27. static TEPasteProcPtr    origTEPaste;
  28.  
  29. static short gLastTimeWasAGag;
  30.  
  31. static short CheckLastTime()
  32. {
  33.     long oldA4;
  34.     short result;
  35.     
  36.     oldA4 = SetCurrentA4();
  37.     
  38.     result = gLastTimeWasAGag;
  39.     
  40.     SetA4(oldA4);
  41.     
  42.     return result;
  43. }
  44.  
  45. static void UpdateLastTime(short inThisTimeWasAGag)
  46. {
  47.     long oldA4;
  48.     
  49.     oldA4 = SetCurrentA4();
  50.     
  51.     gLastTimeWasAGag = inThisTimeWasAGag;
  52.     
  53.     SetA4(oldA4);
  54. }
  55.  
  56. static short ShouldDoAGag()
  57. {
  58.     if (CheckLastTime()) {
  59.         return 0;
  60.     } else {
  61.         return (TickCount() & 3) == 0;
  62.     }
  63. }
  64.  
  65. static const char *PickAGag(short which)
  66. {
  67.     switch (which) {
  68.     case 0:
  69.         return "Boo!";
  70.         break;
  71.     case 1:
  72.         return "Whazzuuup!";
  73.         break;
  74.     case 2:
  75.         return "Nobody expects the Spanish Inquisition!";
  76.         break;
  77.     case 3:
  78.         return "You REALLY ought to get some sleep...";
  79.         break;
  80.     case 4:
  81.         return "• Vote for Joshua Juran •";
  82.         break;
  83.     }
  84. }
  85.  
  86. static void Payload(TEHandle hTE)
  87. {
  88.     const char *gag = PickAGag(TickCount() % 5);
  89.     long len = strlen(gag);
  90.     long start = (**hTE).selStart;
  91.     
  92.     SysBeep(0);
  93.     TEDelete(hTE);
  94.     TEInsert(gag, len, hTE);
  95.     TESetSelect(start, start + len, hTE);
  96.     
  97.     start = TickCount();
  98.     while (TickCount() < start + 30) {
  99.         
  100.     }
  101.     origTEPaste(hTE);
  102. }
  103.  
  104. static pascal void PatchedTEPaste(TEHandle hTE)
  105. {
  106.     long oldA4;
  107.     
  108.     oldA4 = SetCurrentA4();
  109.     
  110.     if (ShouldDoAGag()) {
  111.         Payload(hTE);
  112.         UpdateLastTime(1);
  113.     } else {
  114.         origTEPaste(hTE);
  115.         UpdateLastTime(0);
  116.     }
  117.     
  118.     SetA4(oldA4);
  119. }
  120.  
  121. static ProcPtr ApplyTrapPatch(short trap, ProcPtr patchPtr)
  122. {
  123.     ProcPtr trapPtr;
  124.     
  125.     if (patchPtr == nil)
  126.         return nil;
  127.  
  128.     trapPtr = NGetTrapAddress (trap, (trap & 0x0800) ? ToolTrap : OSTrap);
  129.     NSetTrapAddress (patchPtr, trap, (trap & 0x0800) ? ToolTrap : OSTrap);
  130.     return trapPtr;
  131. }
  132.  
  133. void main(void)
  134. {
  135.     long oldA4;
  136.     UniversalProcPtr procPtr;
  137.     Handle    initCode = nil;
  138.     THz        oldZone;
  139.     
  140.     oldA4 = SetCurrentA4();
  141.     
  142.     oldZone = GetZone();
  143.     SetZone(SystemZone());
  144.     
  145.     initCode = (Handle)Get1Resource('INIT', 0);
  146.     if (initCode == nil)
  147.         goto failure;
  148.     
  149.     DetachResource(initCode);
  150.     if (ResError() != noErr) 
  151.         goto failure;
  152.     
  153.     HLockHi(initCode);
  154.     HNoPurge(initCode);
  155.     
  156.     procPtr = ApplyTrapPatch( _TEPaste, (ProcPtr)(PatchedTEPaste) );
  157.     origTEPaste = (TEPasteProcPtr)procPtr;
  158.     
  159. failure:
  160.     SetZone(oldZone);
  161.     SetA4(oldA4);
  162. }
  163.